 @注：以下全局参数在C中可读写,shellcode 目前不使用
.global _dlopen_addr_s                 @dlopen函数在目标进程中的地址
.global _dlopen_param1_s               @dlopen参数1:mbembed.so在系统内的路径
.global _dlopen_param2_s               @dlopen参数2:mode模式

.global _dlsym_addr_s                  @dlsym参数1:dlsym()在目标进程中的地址
.global _dlsym_param2_s                @dlsym参数2:函数名，根据函数名调用so中的某个方法

.global _dlclose_addr_s                @dlcose在目标进程中的地址

.global _inject_start_s                @汇编代码段的起始地址
.global _inject_end_s                  @汇编代码段的结束地址

.global _inject_function_param_s       @hook_entry参数在目标进程中的地址

.global _saved_cpsr_s                  @保存CPSR，以便执行完hook_entry之后恢复环境
.global _saved_r0_pc_s                 @保存r0-r15，以便执行完hook_entry之后恢复环境

.data

_inject_start_s:
	@ debug loop
3:
	@sub r1, r1, #0
	@B 3b

	@ dlopen
	ldr r1, _dlopen_param2_s           @设置dlopen第2个参数  mode 打开模式
	ldr r0, _dlopen_param1_s           @设置dlopen第1个参数  libmbembed.so文件路径，路径名称保存在_dlopen_param1_s中，也即在mmap开辟的地址空间内
	ldr r3, _dlopen_addr_s             @设置dlopen函数地址，函数地址由get_remote_addr()计算得出
	blx r3                             @执行dlopen函数,返回值位于R0中
	subs r4, r0, #0                    @把dlopen的返回值so的引用保存在r4中，以方便后面dlclose使用
	beq	2f                             @跳到2处执行

	@dlsym
	ldr r1, _dlsym_param2_s            @设置dlsym第二个参数(执行的hook函数名)，第一个参数so引用已经在r0中了
	ldr r3, _dlsym_addr_s              @设置dlsym函数地址
	blx r3                             @执行dlsym函数，返回值位于r0中
	subs r3, r0, #0                    @把返回值<hook_entry()在目标进程中的地址>保存在R3中
	beq 1f                             @跳到1处执行

	@call our function
	ldr r0, _inject_function_param_s   @设置hook_entry第一个参数
	blx r3                             @执行hook_entry函数
	subs r0, r0, #0
	beq 2f                             @恢复最初hook之前的上下文环境

1:
	@dlclose
	mov r0, r4
	ldr r3, _dlclose_addr_s           @dlopen的函数地址保存在R4中，现在执行R3内dlclose,关闭dlopen
	blx r3

2:
	@restore context
	ldr r1, _saved_cpsr_s             @恢复CPSR
	msr cpsr_cf, r1
	ldr sp, _saved_r0_pc_s            @恢复寄存器r0-r15
	ldmfd sp, {r0-pc}

_dlopen_addr_s:                       @初始化_dlopen_addr_s = 0X11111111
.word 0x11111111

_dlopen_param1_s:
.word 0x11111111

_dlopen_param2_s:
.word 0x2                             @RTLD_GLOBAL

_dlsym_addr_s:
.word 0x11111111

_dlsym_param2_s:
.word 0x11111111

_dlclose_addr_s:
.word 0x11111111

_inject_function_param_s:
.word 0x11111111

_saved_cpsr_s:
.word 0x11111111

_saved_r0_pc_s:
.word 0x11111111

_inject_end_s:                        @代码结束地址

.space 0x400, 0                       @代码段空间大小

.end
